package com.xing.algorithm.array;

import java.util.HashSet;

public class ValidSudo {
    public static boolean isValidSudoku(char[][] board) {
        if(board.length != 9) {
            return false;
        }

        int i = 0;
        for(; i < board.length; i ++) {
            if(board[i].length != 9) {
                return false;
            }
        }

        HashSet<Character> sets = null;

        //检查行
        i = 0;
        for(; i < board.length; i ++) {

            sets = new HashSet<Character>();
            for(int j = 0; j < board[i].length; j ++) {
                Character ct = new Character(board[i][j]);
                if(ct.equals('.')) {
                    continue;
                }
                if(!sets.contains(ct)) {
                    sets.add(ct);
                }else {
                    return false;
                }
            }
        }

        //检查列
        i = 0;
        for(; i < board.length; i ++) {

            sets = new HashSet<Character>();
            for(int j = 0; j < board[i].length; j ++) {
                Character ct = new Character(board[j][i]);
                if(ct.equals('.')) {
                    continue;
                }
                if(!sets.contains(ct)) {
                    sets.add(ct);
                }else {
                    return false;
                }
            }
        }

        //检查块
        i = 0;
        for(; i < board.length; i ++) {

            for(int j = 0; j < board[i].length; j ++) {


                if(i % 3 == 0 && j % 3 == 0) {
                    sets = new HashSet<Character>();
                    for(int k = i; k < i + 3; k ++) {

                        for(int m = j; m < j + 3; m ++) {
                            Character ct = new Character(board[k][m]);
                            if(ct.equals('.')) {
                                continue;
                            }
                            if(!sets.contains(ct)) {
                                sets.add(ct);
                            }else {
                                return false;
                            }
                        }
                    }

                }

            }

        }

        return true;


    }

    public static void main(String[] args) {

//        char[][] cs = new char[][]{
//                {'5','3','.','.','7','.','.','.','.'},
//                {'6','.','.','1','9','5','.','.','.'},
//                {'.','9','8','.','.','.','.','6','.'},
//                {'8','.','.','.','6','.','.','.','3'},
//                {'4','.','.','8','.','3','.','.','1'},
//                {'7','.','.','.','2','.','.','.','6'},
//                {'.','6','.','.','.','.','2','8','.'},
//                {'.','.','.','4','1','9','.','2','5'},
//                {'.','.','.','.','8','.','.','7','9'}
//        };
         char[][] cs = new char[][] {
                 {'.','.','.','.','5','.','.','1','.'},
                 {'.','4','.','3','.','.','.','.','.'},
                 {'.','.','.','.','.','3','.','.','1'},
                 {'8','.','.','.','.','.','.','2','.'},
                 {'.','.','2','.','7','.','.','.','.'},
                 {'.','1','5','.','.','.','.','.','.'},
                 {'.','.','.','.','.','2','.','.','.'},
                 {'.','2','.','9','.','.','.','.','.'},
                 {'.','.','4','.','.','.','.','.','.'}
         };

        System.out.println(isValidSudoku(cs));

    }
}
